#=>
    It is important that provide a shared abstraction
    used for all interoperable manner of typed times..
    This has been `AbstractTime` in Base.Dates.
    JuliaTime plans to release AbstractTimes.jl,
    a module to export some abstract time times.
<=#

"""
     Temporal

This is our root abstraction for matters of time.
"""
abstract type Temporal <: Base.Dates.AbstractTime end

"""
     AbstractInstant


For bees, honey is home, hearth and future history.
Instants are the uniquely given temporal referents.

( time as if reality blinks on and off )
"""
abstract type AbstractInstant <: Temporal end

"""
    AbstractMoment

Moments are the apotheosis of eventuality.

( time as if concresence is experience )
"""
abstract type AbstractMoment   <: Temporal end


"""
    AbstractDuration

Successive moments engathered; an extant extent.

Durations are moments in transitive connection.
"""
abstract type AbstractDuration <: Temporal end


"""
    SimpleClock

A simple clock tracks contextless date and time of day.
"""
abstract type SimpleClock      <: AbstractInstant end

"""
    Clock

A clock tracks date and time of day.
"""
abstract type AbstractClock       <: SimpleClock  end
    
"""
    AbstractDate

A date tracks calendric dates.
"""
abstract type AbstractDate       <: AbstractClock end

"""
    AbstractTimeOfDay

A timeofday tracks time within a date
"""
abstract type AbstractTimeOfDay  <: AbstractClock end

"""
    AbstractTimeSpan


A time span is a signed succession of time periods.

This abstraction collects Periods, SimpleSpans and MultiSpans as their shared supertype.
"""
abstract type AbstractTimeSpan <: AbstractDuration end


"""
    AbstractGranularity


A period is a granular duration (e.g. Year, Day, Second).
"""
abstract type AbstractGranularity <: AbstractTimeSpan end

"""
     <Grain>BasedGrain

Ordered sequence categorizing periods by their underlying grain.

NanosecondBasedGrain :> SecondBasedGrain :> DayBasedGrain
""" NanosecondBasedGrain, SecondBasedGrain, DayBasedGrain

abstract type NanosecondBasedGrain <: AbstractGranularity end
abstract type SecondBasedGrain <: NanosecondBasedGrain end
abstract type DayBasedGrain <: SecondBasedGrain end

"""
     <Grain>BasedGrain

abstract type AbstractGranularUnit <: AbstractGranularity end
Ordered sequence categorizing periods by their underlying grain.

MonthBasedGrain :> YearBasedGrain
""" MonthBasedGrain, YearBasedGrain

abstract type MonthBasedGrain <: AbstractGranularity end
abstract type YearBasedGrain <: MonthBasedGrain end


"""
    AbstractGranularUnit

Unitized version of a grain (e.g. yr for Year, dy for Day).
"""
abstract type AbstractGranularUnit <: AbstractGranularity end

"""
    AbstractSimpleSpan


A span of time represented by an integer multiple of
  a time unit that is supported as a time period.
"""
abstract type AbstractSimpleSpan <: AbstractTimeSpan end


"""
    AbstractMultiSpan


A span of time represented by more than one SimpleSpan.
The implict (or quiesent) sum of incommensurable time units;
this multivalued potentiality collapses uniquely when
attached to any situated moment.
Given a rooting date, time of day and time zone,
any legitimate (well formed, appropriately bounded)
MultiSpan may be added onto or subracted into the
rooted moment.  When being applied, the MultiSpan
melds with Moment. This adaption displaces about a
timeline: this is experienced as temporal resituation.
"""
abstract type AbstractMultiSpan <: AbstractTimeSpan end
